{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(page-spiking)=\n",
    "# Introduction to spiking systems\n",
    "\n",
    "Artificial neural networks (as we know them from [PyTorch](https://pytorch.org)) typically consist of linear transformations (such as Convolutions) and point-wise non-linearities such as the rectified linear unit (ReLU). In contrast spiking neural networks take their inspiration from biological\n",
    "neurons. They operate on spikes - events in time - which are combined by linear transformations and integrated by neuron circuits models, such as the LIF\n",
    "neuron model. In other words compared to artificial neural networks, where operation on temporal data is a choice, all spiking neural networks operate on\n",
    "temporal data. One way to look spiking neural networks is to regard them as specific *recurrent neural networks* (RNNs) with the sequence dimension explicitely identified with time and with the values at each timestep that are exchanged between layers restricted to binary values. \n",
    "\n",
    "Norse implements state-of-the-art methods to train spiking neural networks in a way that is convenient and accessible to a machine learning researcher.\n",
    "The eventual goal is to fully explore the sparse information processing of spiking neural networks on neuromorphic hardware. But even if you are not motivated by such application and just curious how information processing can be done by systems whose behaviour is closer to that of biological brains, this \n",
    "library might be for you. \n",
    "\n",
    "In this page we will cover how to \n",
    "1. Simulate neurons\n",
    "2. Investigate and plot our first spiking neuron\n",
    "\n",
    "\n",
    ":::{note}\n",
    "You can execute the code below by hitting <i class=\"fas fa-rocket\"></i> above and pressing <i class=\"fas fa-play\"></i> Live Code.\n",
    ":::"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simulating neurons\n",
    "\n",
    "Neurons consist of two things: the **activation function** and the **neuron membrane state**. To start working with them, we first have to import Norse, aswell as a number of libraries we will use in the course of this notebook.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.0.7'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import torch\n",
    "import norse\n",
    "import numpy as np\n",
    "\n",
    "plt.style.use(\"../resources/matplotlibrc\")\n",
    "norse.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Defining our first neuron model\n",
    "\n",
    "One of the simples neuron models, we have added is the [**leaky integrator**](norse/generated/norse.torch.module.leaky_integrator.LI.html). This particular model integrates an input current and on a \"membrane\" modelled by a *leaky* capacitor. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LI(p=LIParameters(tau_syn_inv=tensor(200.), tau_mem_inv=tensor(100.), v_leak=tensor(0.)), dt=0.001)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "activation = norse.torch.LI()\n",
    "activation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Defining our input spikes\n",
    "\n",
    "By convention most of our neuron models expect to operate on *input spikes*. In a time discretised setting this is just a sequence of tensors containing binary values. By default we place spikes on a grid spaced by $1 \\text{ms}$. So we can define an *input spike sequence* with spikes at $20 \\text{ms}$ and\n",
    "$100 \\text{ms}$ and use the Leaky Integrator (LI) to process it, resulting in a *voltage trace*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "data = torch.zeros(1000,1)\n",
    "data[20] =  1.0\n",
    "data[100] = 1.0\n",
    "\n",
    "voltage_trace, _ = activation(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualizing neuron voltage\n",
    "\n",
    "Since this simulation happened over 1000 timesteps (1 second), we expect the model to output the evolution of the membrane potential (the voltage trace), which we can plot, we indicate by red vertical lines the times at which we inject input spikes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f8350fbb0d0>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 840x540 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.xlabel('time [ms]')\n",
    "plt.ylabel('membrane potential')\n",
    "plt.plot(voltage_trace.detach())\n",
    "plt.axvline(20, color='red')\n",
    "plt.axvline(100, color='red')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The time course of the membrane potential for this given input is influenced by the parameters passed to the leaky integrator. You can experiment with different values by manipulating the sliders:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7b3afcd21bfb46bfb50317ac4451ad72",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=10.0, continuous_update=False, description='tau_mem', max=200.0, min=1…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "from ipywidgets import interact, IntSlider, FloatSlider\n",
    "from functools import partial\n",
    "IntSlider = partial(IntSlider, continuous_update=False)\n",
    "FloatSlider = partial(FloatSlider, continuous_update=False)\n",
    "\n",
    "\n",
    "@interact(\n",
    "    tau_mem=FloatSlider(min=10,max=200,step=1.0, value=10),\n",
    "    tau_syn=FloatSlider(min=10,max=200,step=1.0, value=20),\n",
    "    t0=IntSlider(min=0, max=1000, step=1, value=20),\n",
    "    t1=IntSlider(min=0, max=1000, step=1, value=100),\n",
    ")\n",
    "def experiment(tau_mem, tau_syn, t0, t1):\n",
    "    plt.figure()\n",
    "    num_neurons = 1\n",
    "    tau_mem_inv = torch.tensor([1/(tau_mem * 0.001)])\n",
    "    tau_syn_inv = torch.tensor([1/(tau_syn * 0.001)])\n",
    "    data = torch.zeros(1000,num_neurons)\n",
    "    data[t0] =  1.0\n",
    "    data[t1] = 1.0\n",
    "\n",
    "    voltage_trace, _ = norse.torch.LI(p=norse.torch.LIParameters(tau_mem_inv=tau_mem_inv, tau_syn_inv=tau_syn_inv))(data)\n",
    "    plt.xlabel('time [ms]')\n",
    "    plt.ylabel('membrane potential')\n",
    "    for i in range(num_neurons):\n",
    "        plt.plot(voltage_trace.detach()[:,i])\n",
    "    plt.axvline(t0, color='red', alpha=0.9)\n",
    "    plt.axvline(t1, color='red', alpha=0.9)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see as the membrane time constant $\\tau_\\text{mem}$ is increased (and consequentely its inverse decreased), the decay of the membrane voltage is slower, but it also reaches a smaller value. The value of the synaptic time constant $\\tau_\\text{syn}$ in turn influences how quickly the synaptic input decays exponentially"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Our first Spiking Neuron\n",
    "\n",
    "Spikes that stimulate a neuron in close succession lead to an increasingly higher membrane potential, which is in some sense the foundational principle of information processing with spiking neurons: If one replaces the Leaky Integrator with a Leaky Integrate and *Fire* neuron model (```LIF```) one arrives at the simplest *spiking* neuron model implemented in Norse. Since we only return the spike train produced by a ```LIF``` neuron by default we define a simple helper function first, which also records the voltage trace. To do so we use the ```LIFCell``` module, which only computes the state evolution for one timestep. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def integrate_and_record_voltages(cell):\n",
    "    def integrate(input_spike_train):\n",
    "        T = input_spike_train.shape[0]\n",
    "        s = None\n",
    "        spikes = []\n",
    "        voltage_trace = []\n",
    "        for ts in range(T):\n",
    "            z, s = cell(input_spike_train[ts], s)\n",
    "            spikes.append(z)\n",
    "            voltage_trace.append(s.v)\n",
    "        return torch.stack(spikes), torch.stack(voltage_trace)\n",
    "    return integrate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By repeating the same experiment, that is stimulating the ```LI``` and ```LIF``` neuron with spikes at $20, t_0, t_1$ milliseconds, we immediately see the difference: Once the LIF neuron reaches its threshold value $v_\\text{th}$ it *fires* resulting in an output spike and a reset of its membrane voltage to $0$. The output spike train produced by a ```LIF``` neuron could be used for further processing by other neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ce6677ff01a54a0b8c38cfcaa8acdc40",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=40.0, continuous_update=False, description='tau_mem', max=200.0, min=1…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact(\n",
    "    tau_mem=FloatSlider(min=10,max=200,step=1.0, value=40),\n",
    "    tau_syn=FloatSlider(min=10,max=200,step=1.0, value=60),\n",
    "    v_th=FloatSlider(min=0.1, max=2.0, step=0.1, value=0.8),\n",
    "    t0=IntSlider(min=0, max=1000, step=1, value=85),\n",
    "    t1=IntSlider(min=0, max=1000, step=1, value=150),\n",
    ")\n",
    "def experiment(tau_mem, tau_syn, v_th, t0, t1):\n",
    "    plt.figure()\n",
    "    num_neurons = 1\n",
    "    tau_syn_inv = torch.tensor([1/(tau_syn * 0.001)])\n",
    "    tau_mem_inv = torch.tensor([1/(tau_mem * 0.001)])\n",
    "    data = torch.zeros(1000,num_neurons)\n",
    "    data[20] = 1.0\n",
    "    data[t0] = 1.0\n",
    "    data[t1] = 1.0\n",
    "\n",
    "    cell = norse.torch.LIFCell(p=norse.torch.LIFParameters(tau_mem_inv=tau_mem_inv, tau_syn_inv=tau_syn_inv, v_th=torch.as_tensor(v_th)))\n",
    "    lif_integrate = integrate_and_record_voltages(cell)\n",
    "\n",
    "    voltage_trace, _ = norse.torch.LI(p=norse.torch.LIParameters(tau_mem_inv=tau_mem_inv, tau_syn_inv=tau_syn_inv))(data)\n",
    "    zs, lif_voltage_trace = lif_integrate(data)\n",
    "    plt.xlabel('time [ms]')\n",
    "    plt.ylabel('membrane potential')\n",
    "    plt.plot(voltage_trace.detach(), label=\"LI\")\n",
    "    plt.plot(lif_voltage_trace.detach(), label=\"LIF\")\n",
    "    plt.axhline(v_th, color='grey')\n",
    "    plt.legend()\n",
    "    plt.show()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "0a5e488a647543f81e2287f85ff7f355ab792b59c9c764c44d4aad7b07e72a78"
  },
  "kernelspec": {
   "display_name": "Python 3.8.8 64-bit ('norse': conda)",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.4"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
